(declare (usual-integrations))

(define-syntax when
  (syntax-rules ()
    ((when predicate action0 . actions)
     (if predicate
         (begin action0 . actions)
         #f))))

(define-syntax unless
  (syntax-rules ()
    ((unless predicate action0 . actions)
     (if predicate
         #f
         (begin action0 . actions)))))

(define-syntax dotimes
  (syntax-rules ()
    ((dotimes (variable limit-expr return-value ...) body0 body ...)
       (let ((limit limit-expr))
         (do ((variable 0 (+ variable 1)))
             ((>= variable limit) return-value ...)
           body0
           body ...)))))

(define-syntax sum
  (syntax-rules ()
    ((sum index-variable start limit-expr term)
     (let ((limit limit-expr))
       (do ((index-variable start (+ index-variable 1))
            (answer 0 (+ answer term)))
           ((>= index-variable limit) answer))))))

(define-syntax time-expression
  (syntax-rules ()
    ((time-expression phase form0 forms ...)
     (time-a-thunk phase (lambda () form0 forms ...)))))

;;; Represent matrices as vectors of rows.
;;; Cheesy, but effective.
(define (matrix-height matrix)
  (vector-length matrix))

(define (matrix-width matrix)
  (vector-length (vector-ref matrix 0)))

(define (matrix-ref matrix i j)
  (vector-ref (vector-ref matrix i) j))

(define-integrable (matrix-ref/c matrix i)
  (let ((row (vector-ref matrix i)))
    (lambda (j)
      (vector-ref row j))))

(define (matrix-set! matrix i j value)
  (vector-set! (vector-ref matrix i) j value))

(define (allocate-matrix height width)
  (let ((rows (make-vector height #f)))
    (dotimes (i height rows)
      (vector-set! rows i (make-vector width 0)))))

(define (test-multiply matrix-multiply)
  (let ((matrix-a (allocate-matrix 2 3))
        (matrix-b (allocate-matrix 3 2)))
    ;; a, row 0 (1 0 2)
    (matrix-set! matrix-a 0 0 1)
    (matrix-set! matrix-a 0 1 0)
    (matrix-set! matrix-a 0 2 2)
    ;; a, row 1 (-1 3 1)
    (matrix-set! matrix-a 1 0 -1)
    (matrix-set! matrix-a 1 1 3)
    (matrix-set! matrix-a 1 2 1)
    ;; b, row 0 (3 1)
    (matrix-set! matrix-b 0 0 3)
    (matrix-set! matrix-b 0 1 1)
    ;; b, row 1 (2 1)
    (matrix-set! matrix-b 1 0 2)
    (matrix-set! matrix-b 1 1 1)
    ;; b, row 2 (1 0)
    (matrix-set! matrix-b 2 0 1)
    (matrix-set! matrix-b 2 1 0)

    (let ((result (matrix-multiply matrix-a matrix-b)))
      (or (and (= (matrix-ref result 0 0) 5)
               (= (matrix-ref result 0 1) 1)
               (= (matrix-ref result 1 0) 4)
               (= (matrix-ref result 1 1) 2))
          (error "broken")))))

;(define (matrix-multiply left right)
;  (unless (= (matrix-width left) (matrix-height right))
;    (error "Cannot multiply"))
;  (let* ((result-height (matrix-height left))
;         (result-width  (matrix-width right))
;         (result-matrix (allocate-matrix result-height result-width)))
;    (dotimes (row result-height result-matrix)
;      (let ((set-result-row! (matrix-set!/c result-matrix row))
;	    (ref-left-row (matrix-ref/c left row)))
;      (dotimes (column result-width)
;        (set-result-row! column
;          (sum k
;               0 (matrix-height right)
;               (* (ref-left-row k)
;                  (matrix-ref right k column)))))))))

(define (binary-matrix->sparse-binary-matrix matrix)
  (let ((result (make-vector (matrix-height matrix))))
    (dotimes (row (vector-length result) (cons (matrix-width matrix) result))
      (let ((row-elements (vector-ref matrix row)))
	(do ((column 0 (+ column 1))
	     (col-rep '() (if (zero? (vector-ref row-elements column))
			      col-rep
			      (cons column col-rep))))
	    ((>= column (vector-length row-elements))
	     (vector-set! result row (reverse col-rep))))))))

(define (diagonal-matrix-multiply left right)
  (unless (= (vector-length left) (vector-length right))
    (error "Cannot multiply"))
  (let* ((limit (vector-length left))
	 (result (make-vector limit 0)))
    (dotimes (i limit result)
      (vector-set! 
       result i (* (vector-ref left i)
		   (vector-ref right i))))))

(define (compute-diagonal-inverse diagonal)
  (let* ((height  (vector-length diagonal))
         (inverse (make-vector height 0)))
    (dotimes (i height inverse)
      (vector-set! inverse i (/ 1.0 (vector-ref diagonal i))))))

(define (vector-times-diagonal-matrix vector matrix)
  (unless (= (vector-length matrix) (vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (make-vector (vector-length vector) 0)))
    (dotimes (i (vector-length vector) result-vector)
      (vector-set! 
       result-vector i
       (* (vector-ref vector i)
	  (vector-ref matrix i))))))

(define (matrix-times-vector matrix vector)
  (unless (= (matrix-width matrix) (vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (make-vector (matrix-height matrix) 0)))
    (dotimes (row (matrix-height matrix) result-vector)
      (let ((row-elements (vector-ref matrix row)))
	(vector-set! 
	 result-vector row
	 (sum column
	   0 (vector-length vector)
	   (* (vector-ref row-elements column)
	      (vector-ref vector column))))))))

(define (binary-matrix-times-vector matrix vector)
  (unless (= (matrix-width matrix) (vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (make-vector (matrix-height matrix) 0)))
    (dotimes (row (matrix-height matrix) result-vector)
      (let ((row-elements (vector-ref matrix row)))
	(dotimes (column (vector-length vector))
	  (unless (zero? (vector-ref row-elements column))
	    (vector-set! result-vector row
			 (+ (vector-ref result-vector row)
			    (vector-ref vector column)))))))))

(define (sparse-binary-matrix-times-vector matrix vector)
  (unless (= (car matrix) (vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (make-vector (matrix-height (cdr matrix)) 0)))
    (dotimes (row (matrix-height (cdr matrix)) result-vector)
      (let ((row-elements (vector-ref (cdr matrix) row)))
	(do ((tail row-elements (cdr tail)))
	    ((null? tail))
	  (let ((column (car tail)))
	    (vector-set! result-vector row
			 (+ (vector-ref result-vector row)
			    (vector-ref vector column)))))))))

(define (vector-times-binary-matrix vector matrix)
  (unless (= (vector-length vector) (matrix-height matrix))
    (error "Cannot multiply"))
  (let ((result-vector (make-vector (matrix-width matrix) 0)))
    (dotimes (row (vector-length vector) result-vector)
      (let ((row-elements (vector-ref matrix row)))
	(dotimes (column (matrix-width matrix))
	  (unless (zero? (vector-ref row-elements column))
	    (vector-set! result-vector column
			 (+ (vector-ref result-vector column)
			    (vector-ref vector row)))))))))

(define (vector-times-sparse-binary-matrix vector sparse-matrix)
  (unless (= (vector-length vector) (matrix-height (cdr sparse-matrix)))
    (error "Cannot multiply"))
  (let ((result-vector (make-vector (car sparse-matrix) 0)))
    (dotimes (row (vector-length vector) result-vector)
      (let ((row-elements (vector-ref (cdr sparse-matrix) row)))
	(do ((tail row-elements (cdr tail)))
	    ((null? tail))
	  (let ((column (car tail)))
	    (vector-set! result-vector column
			 (+ (vector-ref result-vector column)
			    (vector-ref vector row)))))))))

(define (diagonal-matrix-times-vector matrix vector)
  (unless (= (vector-length matrix) (vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (make-vector (vector-length matrix) 0)))
    (dotimes (row (vector-length matrix) result-vector)
      (vector-set! 
       result-vector row
       (* (vector-ref matrix row)
	  (vector-ref vector row))))))

(define (matrix-row-sums sparse-matrix)
  ;; Compute the row sums without multiplying the matrix
  ;; by its transform.
  (let* ((height (matrix-height (cdr sparse-matrix)))
	 (width (car sparse-matrix))
	 (column-sums (make-vector width 0)))
    (dotimes (row height)
      (do ((tail (vector-ref (cdr sparse-matrix) row) (cdr tail)))
	  ((null? tail))
	(let ((col (car tail)))
	  (vector-set! column-sums col
		       (+ (vector-ref column-sums col) 1)))))
    (sparse-binary-matrix-times-vector sparse-matrix column-sums)))

(define (compute-pi row-sums)
  (let* ((length (vector-length row-sums))
         (total  (sum i 0 length (vector-ref row-sums i)))
         (pi     (make-vector length 0)))
    (dotimes (i length pi)
      (vector-set! pi i (/ (vector-ref row-sums i) total)))))

(define (compute-d pi)
  (let* ((h (vector-length pi))
         (d (make-vector h 0)))
    (dotimes (i h d)
      (vector-set! d i (sqrt (vector-ref pi i))))))

(define (close-enuf? left right tolerance)
  (let ((limit (vector-length left)))
    (define (scan i)
      (or (>= i limit)
	  (and (< (abs (- (vector-ref left i) 
			  (vector-ref right i))) 
		  tolerance)
	       (scan (+ i 1)))))
    (scan 0)))

(define (test-eigenvector matrix eigenvector)
  (or 
   (close-enuf? eigenvector
		(matrix-times-vector matrix eigenvector)
		.00001)
   (error "It's not an eigenvector")))

(define (vector-normalize v)
  (let* ((h      (vector-length v))
         (answer (make-vector h 0))
         (total (sqrt (sum i
			0 h
			(let ((x (vector-ref v i)))
			  (* x x))))))
    (dotimes (i h answer)
      (vector-set! answer i (/ (vector-ref v i) total)))))

(define (orthogonal-vector v)
  (let ((limit (vector-length v))
        (n (make-vector (vector-length v) 0)))

    (dotimes (i (floor (/ limit 2)))
      (vector-set! n i (vector-ref v (- limit i 1)))
      (vector-set! n (- limit i 1) (- (vector-ref v i))))
    (vector-normalize n)))

(define (analyze sparse-a)
  (let* ((rho      (time-expression "Row sums" (matrix-row-sums sparse-a)))
         (pi       (time-expression "Pi" (compute-pi rho)))
         (d        (time-expression "d" (compute-d pi)))
         (rinverse (time-expression "rinverse" (compute-diagonal-inverse rho)))
         (dinverse (time-expression "dinverse" (compute-diagonal-inverse d)))
	 (q (let ((drinverse (time-expression "drinverse" (diagonal-matrix-multiply d rinverse))))
	      (lambda (v)
		(diagonal-matrix-times-vector
		 drinverse
		 (sparse-binary-matrix-times-vector
		  sparse-a
		  (vector-times-sparse-binary-matrix
		   (diagonal-matrix-times-vector dinverse v)
		   sparse-a))))))

         (first-eigenvector
	  (time-expression "First eigenvector"
			   (vector-times-diagonal-matrix pi dinverse))))

    (unless (close-enuf? first-eigenvector (q first-eigenvector) .000001)
      (pp first-eigenvector)
      (pp (q first-eigenvector))
      (error "first eigenvector is wrong"))

    (let ((initial-vector (orthogonal-vector first-eigenvector)))
      (time-expression 
       "Converge to second eigenvector"
       (do ((v (vector-normalize (q initial-vector))
	       (vector-normalize (q v)))
	    (count 0 (+ count 1))
	    (old-v initial-vector v))
	   ((close-enuf? v old-v 0.0001) 
	    (display "; Converged in ")
	    (display count)
	    (display " iterations.")
	    (newline)
	    (check-answer v)))))))

(define (time-a-thunk phase thunk)
  (let ((start (runtime)))
    (let ((answer (thunk)))
      (let ((end (runtime)))
	(display ";; Phase ")
	(display phase)
	(display " took ")
	(display (- end start))
	(display " seconds.")
	(newline)
	answer))))

(define (timings)
  (do ((i  5 (+ i j))
       (j  3 i))
      ((>= i 32768))
    (display i)
    (newline)
    (process-unique i)
    (pp (analyze *cluster-matrix*))
    (newline)
    (newline))
  (let ((i  32768))
    (display i)
    (newline)
    (process-unique i)
    (pp (analyze *cluster-matrix*))
    (newline)
    (newline)))

(define *known-answers*
  (list
  #(.21679319558236318 .20693139921066953 .15492336040471358 -.6656496295442588 -.6656496296539223)
  #(.05927032218622061 .07655700764832962 .08485981499872591 .08485981499872591
    .08133164266307155 .05711994778362531 -.6951065218441732 -.6951065212190557)
  #(3.2508437584538356e-2 .04500575375988995    .04591322013699846 2.7400475177666365e-2 2.6939996437319917e-2
    2.7128606613889637e-2 2.9593163937529362e-2 .03254323535722278 .03254323535722279    .03109773174377306
    2.3911518618528537e-2 -.7028742560931632    -.7028742560931632)
  #(2.1466388676227043e-2 2.1466388676227043e-2 2.1587716031154662e-2 1.4067014880602195e-2 1.4436360397095113e-2
    1.3429465621334704e-2 1.7735384883597046e-2 1.7611927665164423e-2 2.0925059386505025e-2 2.8638635393483047e-2
    2.9225152532530378e-2 1.8545222736727828e-2 1.9027263125704692e-2 1.9139966790094564e-2 .02001636840458373
    2.1839373318962577e-2 2.1839373318962577e-2 2.0949658062524055e-2 .01726444091192395    -.7043170575123382
    -.7043170575123382)
  #(1.9874753314313514e-3  2.063844965342526e-3   1.5903731917234541e-3  .883354798376658       1.428900650074917e-3
    1.4374370355089774e-3  1.496085445182345e-3   1.4202739056069081e-3  1.267029231902207e-3   1.9533165127634416e-3
    1.9533165127634416e-3  1.0892870721536906e-3  1.2052185971828638e-3  1.979983997598748e-3   1.9667179359603455e-3
    1.9865866258237256e-3  1.264645754726496e-3   1.2857984462486536e-3  1.273023861375658e-3   1.9673511751635772e-4
    1.958031332371124e-4   -4.0858033094921163e-4 -7.215308470688031e-4  -7.209023342165465e-4  -2.2281186167824157e-4
    6.50472798978746e-5    6.50089509122395e-5    -1.7344332703240226e-4 -2.0691612944504753e-4 -2.0691612944504753e-4
    -1.8729140939745457e-4 1.1524298176193109e-4  -.3313873927143553     -.3313873927143553)
  #(-.00577250295730574    -2.7533262503051594e-3 -2.6334408966074653e-3 -4.356535089555308e-3  -4.3848011681237465e-3
    -4.4690209660743765e-3 -4.270183560113258e-3  -4.181970639118137e-3  -4.211690213862708e-3  -4.211690213862708e-3
    -6.229196237165523e-3  -6.053169500393992e-3  -2.631051824368952e-3  -4.9700185875482744e-3 -3.630731536810965e-3
    -2.291730451436831e-3  .4352112242774887      .44860546178761573     -2.3989989555403143e-3 -2.2002090290331377e-3
    -3.1696648600428178e-3 -3.128807609604721e-3  -3.2602909246766307e-3 -2.5473344728861843e-3 .6901904226190969
    -8.998798211096348e-3  -9.047147512765795e-3  -9.411661994877777e-3  -8.950327770034945e-3  -7.402973138603197e-3
    -1.1745084574789193e-2 -1.1745084574789193e-2 -4.448960974957839e-3  -7.012560260467101e-3  -1.1895078079584924e-2
    -.01182032473169169    -1.1932279797535016e-2 -7.456313798728352e-3  -7.574039243303011e-3  -7.189543470380164e-3
    -9.011616502213132e-3  -8.954763186712667e-3  -.01084059184415834    -.01484751908980537    -1.5210650881806462e-2
    -9.378810075216003e-3  -.00987478113013717    -9.927527559805917e-3  -1.0060868144150952e-2 -1.1044021800234052e-2
    -1.1044021800234052e-2 -1.0587207465597166e-2 -8.949618054516802e-3  -.2547152428683804     -.2547152428683804)
  #(2.2276809074805535e-3 .19630443466747904    9.717501845672086e-3  9.717501845672086e-3  9.717501845672086e-3
    9.717501845672086e-3  9.717501845672086e-3  9.717501845672086e-3  9.717501845672086e-3  9.717501845672086e-3
    3.5324537115071757e-3 4.162768856326325e-3  1.1264662497484593e-2 1.1264662497484593e-2 1.1264662497484593e-2
    1.1142050600477694e-2 1.0637533733155284e-2 .00734976064212631    3.4718592424038534e-3 5.904621589081392e-3
    .00787404904682687    7.805285458887903e-3  7.764966236205427e-3  5.485649243092653e-3  6.837106663166859e-3
    6.9737326211297855e-3 7.108385677225102e-3  7.108385677225102e-3  7.463985623950519e-3  7.063333433377333e-3
    .12851141873131813    5.048074712479943e-3  5.113048780674097e-3  .00490960479043168    6.214490435998334e-3
    3.5324537115071757e-3 4.3075652605247695e-3 8.282362702805142e-3  8.338489086246216e-3  8.504531269762533e-3
    8.111755307013468e-3  7.937501292412703e-3  7.995982099831368e-3  7.995982099831368e-3  7.258150272065654e-3
    7.116860541414379e-3  5.896582666103178e-3  3.844002171353707e-3  4.289295806746486e-3  2.974831163631635e-3
    -.6305257778585389    -.6499310954463734    4.130338968784611e-3  2.682380650533238e-3  4.111703463362016e-3
    4.118280250146894e-3  4.262430062099914e-3  3.6092479634245852e-3 -.2225883065953983    8.558737959209459e-3
    8.631874937108997e-3  8.921621975785828e-3  8.559032074762458e-3  6.731431748653509e-3  1.0301451660256866e-2
    1.0301451660256866e-2 5.2441732185903025e-3 6.960162730336302e-3  1.0421157675489581e-2 1.0361476430792632e-2
    1.0450870359321235e-2 6.736642422178538e-3  6.8282386189104614e-3 6.6547157520731055e-3 6.931243255818632e-3
    6.889947436232288e-3  7.972221324409447e-3  1.0145642881101168e-2 1.0767289763586957e-2 6.6207512546870755e-3
    7.907450043024962e-3  7.941959165810341e-3  7.176670081808444e-3  7.946172248716032e-3  7.946172248716032e-3
    7.5511205394188045e-3 6.817657333241969e-3  -.1878828980949552    -.1878828980949552)
  #(-1.6053923007426161e-3 -1.6053923007426161e-3 -.00163998624916191    -1.405710357252065e-3  -1.5870248645824554e-3
    -.00167052611537245    -1.666788386890924e-3  -1.3457323193916727e-3 -2.0519129014476894e-3 .3323067195819116
    1.8447792907750177e-3  -1.2745213501475735e-3 -2.283654685588516e-3  -2.558187932276668e-3  -3.0554532712089404e-3
    -3.1350465140180797e-3 -2.2593567644993754e-3 -2.2593567644993754e-3 -1.9651869594783516e-3 -1.9651869594783516e-3
    -2.1188215339694606e-3 -2.1188215339694606e-3 .32609483129125755     -2.2593567644993754e-3 2.6983335850421014e-3
    .3415643003829347      .3668989139176384      -1.6774819538053606e-3 .4177357064003876      -2.2593567644993754e-3
    4.7260483816805233e-4  -1.2525381193678317e-3 -1.171435673160586e-3  -1.9543179572761135e-3 -2.2593567644993754e-3
    -3.3329651302741853e-3 -3.7331693728719843e-3 -3.7966692681341133e-3 -1.208381393066014e-3  -2.259356764499376e-3
    -2.259356764499376e-3  -1.5714269181094742e-3 -1.2992329505837055e-3 -2.9389439944527596e-3 -3.7137952264102683e-3
    -3.6488277536583444e-3 -1.4630597738370195e-3 -1.9349783932060766e-3 -1.9349783932060766e-3 -1.9349783932060766e-3
    4.831273540352237e-3   4.452780332345534e-3   4.780674769596692e-3   4.7806747695966914e-3  -1.2420061466280328e-3
    -9.081711961919215e-4  .3281643649562733      -4.869744086475552e-3  -4.869744086475552e-3  -4.869744086475552e-3
    -4.869744086475552e-3  -4.869744086475552e-3  -4.869744086475552e-3  -4.869744086475552e-3  -4.869744086475552e-3
    -2.259356764499376e-3  -2.072260878794975e-3  -1.5175465509527132e-3 -1.5175465509527132e-3 -1.5175465509527132e-3
    -1.5014918219369156e-3 -1.435474591131093e-3  -1.2499878066536598e-3 -1.081774246566297e-3  -2.146364253580809e-3
    -3.2988142392196555e-3 -3.2805115931009918e-3 -3.249841684123802e-3  -2.1993091184124448e-3 -2.831389660236222e-3
    -2.884238339194815e-3  -2.936005761965802e-3  -2.936005761965802e-3  -3.142477869150425e-3  -2.918985579953283e-3
    -1.0555889220534398e-3 -2.474595257330973e-3  -2.5341976309034486e-3 -2.268758698533765e-3  -3.0488833841295555e-3
    -2.259356764499376e-3  -1.3133213468908703e-3 -2.0262141273334963e-3 -2.0615594174944194e-3 -2.0998107548682687e-3
    -1.9864235182972005e-3 -1.9459429830806048e-3 -1.9594925202252294e-3 -1.9594925202252294e-3 -3.0105979769651727e-3
    -2.9455327338368904e-3 -1.3062347867167441e-3 -1.7108450222903134e-3 -1.9290299867730546e-3 -1.5633680682391605e-3
    -.27737996183452135    -.2859167202683817     -1.5496999006932304e-3 -1.109005019142728e-3  -1.9374837526616865e-3
    -.00193708554922983    -1.984996228974009e-3  -1.8950672764955119e-3 -.16512453652557355    -3.536736022572239e-3
    -3.592901180813171e-3  -3.705555718241096e-3  -3.5646405221763616e-3 -2.7534896044606873e-3 -4.2173528496663145e-3
    -4.2173528496663145e-3 -2.744015170363204e-3  -2.853423040176576e-3  -4.265385245778967e-3  -4.228412052213969e-3
    -4.2773056057322624e-3 -2.7236366106575586e-3 -2.760284563792877e-3  -2.6748892867125267e-3 -3.0599837781047344e-3
    -3.0424959250298566e-3 -3.820341117605636e-3  -4.696937452333647e-3  -5.0872620194657705e-3 -2.9836736708780394e-3
    -3.6848181039983025e-3 -3.699576141512949e-3  -3.206344038046519e-3  -3.5441070673901593e-3 -3.544107067390159e-3
    -3.3716740985810134e-3 -3.0143853296867302e-3 -.17707633790883898    -.17707633790883898)
  #(3.2387271926350553e-4 3.5591778898361154e-4 3.338794720476983e-4  4.630574311858741e-3  5.1569783133919135e-3
    4.272260859745239e-3  .00483587114709805    6.832359373221951e-4  8.724432342556893e-4  6.368939080785849e-4
    6.172799150486085e-4  8.406539752977636e-4  2.31355441865166e-4   6.781393383271962e-4  6.780358130656504e-4
    .3751922442192868     5.806490078787145e-4  2.724634223918135e-4  6.781393383271962e-4  6.781393383271962e-4
    6.781393383271962e-4  4.967316807931231e-4  3.0573914544674457e-4 .6009860091620602     5.412253065627431e-4
    5.124124950678227e-4  7.639197875595968e-4  6.781393383271962e-4  4.586481945038215e-3  6.781393383271962e-4
    3.3112235379793576e-4 3.8061885937264867e-4 6.781393383271962e-4  7.09506511667436e-4   8.646567344171265e-4
    2.616856828238447e-4  6.392001729774286e-4  6.507776726425954e-4  6.916565717079417e-4  8.351921183006541e-4
    4.1781850190907054e-4 8.515728551013045e-4  8.271330754746716e-4  4.5495571492818136e-3 4.563251104877256e-3
    5.084115838707945e-3  5.096565276093479e-3  3.7969750670324075e-4 2.3325397689419143e-4 5.892735077252493e-4
    1.2887908648232674e-3 4.343251218271427e-4  6.781393383271962e-4  4.0721931148520623e-4 7.823988921457276e-4
    8.320341782004527e-4  7.823988921457276e-4  7.856390321301827e-4  8.046756188326075e-4  7.89186944740631e-4
    7.696755289535817e-4  4.4801977977658664e-4 4.3989628060741047e-4 3.8978588509196074e-4 4.7817210354699516e-4
    4.39666509177978e-4   4.39666509177978e-4   4.453836522953952e-4  3.3318864132047095e-4 4.577425908808295e-4
    2.97254539374513e-4   4.475842619705253e-4  4.8025223957713105e-4 8.496321803627912e-4  4.168429328354041e-4
    5.440613567121473e-4  5.146372551555441e-4  4.3311873443835277e-4 4.384061409726704e-4  4.436394080630467e-4
    2.959174041225325e-4  4.1515267432527835e-4 5.815571160641083e-4  3.726315332383447e-4  3.0910313959958577e-4
    3.9401982729472124e-4 3.9090474906925267e-4 3.807397282086502e-4  3.9889498906393704e-4 3.98894989063937e-4
    3.98894989063937e-4   3.98894989063937e-4   4.1625165823137985e-4 4.56611717813252e-4   4.7983023909146895e-4
    5.243364572363729e-4  3.070168781618658e-4  5.709617400062464e-4  2.406966443933104e-4  3.821067044020645e-4
    5.209083382661466e-4  5.410570723165058e-4  6.656673382021323e-4  8.226862819111137e-4  8.500552527064513e-4
    6.781393383271962e-4  6.781393383271962e-4  5.592286103819013e-4  5.552293872892227e-4  4.378738188693674e-4
    4.378738188693674e-4  .17215000810022682    6.781393383271962e-4  3.215949276172654e-4  .0042325484953774
    4.802804959787978e-3  4.46902649706479e-4   -.3277638504659794    6.781393383271962e-4  3.0101023522734215e-4
    2.9193789358753576e-4 2.755513160958512e-4  5.199471404021734e-4  6.781393383271962e-4  5.784166778902764e-4
    6.312374858173768e-4  6.460087630530985e-4  3.307329812697545e-4  6.781393383271962e-4  6.781393383271964e-4
    3.890639860231626e-4  3.449565512253714e-4  5.121894897677275e-4  6.394487047258383e-4  6.244996942098291e-4
    2.6671585917657797e-4 3.8084879679231755e-4 3.8084879679231755e-4 3.808487967923176e-4  5.498289416475421e-4
    5.036631378717479e-4  5.447645437509515e-4  5.447645437509515e-4  2.821229952700362e-4  2.978264634588643e-4
    4.183432128053761e-3  7.722849766724131e-4  7.722849766724131e-4  7.722849766724131e-4  7.722849766724131e-4
    7.722849766724131e-4  7.722849766724131e-4  7.722849766724131e-4  7.722849766724131e-4  6.781393383271964e-4
    5.874314375212605e-4  4.8474354689424646e-4 4.8474354689424646e-4 4.8474354689424646e-4 4.80223703447034e-4
    4.617006721390325e-4  3.874891646275815e-4  2.7533297776185253e-4 6.238859341880212e-4  8.312834924240547e-4
    8.331979723310215e-4  8.240561304245712e-4  5.030072589472527e-4  7.057921004405425e-4  7.164462950304273e-4
    7.374085522493025e-4  7.374085522493025e-4  8.002986496444777e-4  7.648798225596301e-4  2.76734310106072e-4
    5.916974971036075e-4  6.045691802140881e-4  4.5045463877080777e-4 5.665654728626339e-4  6.781393383271964e-4
    3.681104295845515e-4  5.69000176245542e-4   5.850453612322201e-4  5.955542399558158e-4  5.579741281609305e-4
    5.467430019688983e-4  5.505100653031734e-4  5.505100653031734e-4  8.162167469805139e-4  8.038354014012221e-4
    3.7123241850747297e-4 4.194667983155436e-4  5.472068328788673e-4  4.480473156092074e-4  -.39153840907246396
    -.40358855427301626   4.239541379795558e-4  2.528118510432107e-4  5.392090925710593e-4  5.402166337537099e-4
    5.49478714524624e-4   5.212635719814112e-4  -.21083983953076715   8.833337843532772e-4  9.226950226901568e-4
    9.627934031828641e-4  9.171618189169557e-4  6.289789655457905e-4  9.950971428110069e-4  9.950971428110069e-4
    7.690761623803174e-4  7.091965740031606e-4  1.0051346037480127e-3 9.964130260906436e-4  1.0076324434510659e-3
    6.188323586145029e-4  6.268102191898611e-4  6.420393277239446e-4  6.575002340697172e-4  6.542624809303931e-4
    6.675486051241239e-4  8.391605167615188e-4  9.020866229790666e-4  5.432737600573178e-4  7.338363301653831e-4
    7.364344613825697e-4  5.905521078317383e-4  6.546630018262734e-4  6.546630018262734e-4  6.216986599044309e-4
    6.452559709926153e-4  7.269412035641938e-4  7.269412035641938e-4)
  #(-2.77225666915418e-4   -1.4184192207185588e-4 -1.45593426876054e-4   -1.446029157290313e-4  -1.885668814959854e-4
    -1.212278353893853e-4  -2.2472341861536448e-4 -2.0985499062235442e-4 -2.83897675945287e-4   -1.4017216786603706e-4
    -2.506429438212297e-4  -2.4183653277108416e-4 -2.7551615553705894e-4 -3.8712576466344405e-4 -4.0698770058610344e-4
    -3.6834353099856953e-4 -3.9423728434974994e-4 -1.0188596905278321e-4 -2.2221853718120058e-4 -2.51427371709297e-4
    -4.416256260989495e-4  -1.6371316886993028e-4 -4.2117394439136275e-4 -4.1897620584299585e-4 -2.9116571600670393e-4
    -2.9116571600670393e-4 -2.9116571600670393e-4 -2.9116571600670393e-4 -2.9116571600670393e-4 -2.9116571600670393e-4
    -2.1498111176564795e-4 -2.1498111176564795e-4 -4.1201608971245835e-4 -5.342853898051686e-4  -5.361123718474035e-4
    -5.367019912754097e-4  -5.443454610021521e-4  -5.427841299371486e-4  -5.287360687396616e-4  -5.288190593006031e-4
    -5.287362333623628e-4  -5.302410353679558e-4  -2.4582803332056426e-4 -2.4148755497402813e-4 -1.981327350056423e-4
    -5.537444761738798e-4  -5.46251852307273e-4   -5.550730590902592e-4  -3.297396605283538e-4  -3.304959202965328e-4
    -.0003259274058849     -3.3273516956975555e-4 -3.286522883209764e-4  -3.2516415147048553e-4 -3.304959202965328e-4
    -3.304959202965328e-4  -3.297396605283538e-4  -3.297396605283538e-4  -3.5198599997609577e-4 -3.519859999760958e-4
    -3.3196128146156106e-4 -3.2516415147048553e-4 -3.2439333737371335e-4 -2.254391244609438e-4  -2.2729556792229412e-4
    -2.522857590024619e-4  -2.522857590024619e-4  -4.2498182615668517e-4 -4.5792775644928066e-4 -3.608543110624398e-4
    -3.8309286435642717e-4 -3.8744048625290265e-4 -4.4999788673538965e-4 -4.59975532370554e-4   -4.5330050537249934e-4
    -4.4767225444629593e-4 -2.45175110030609e-4   -4.3620594307280296e-4 -3.337468885875443e-4  -3.602161663128122e-4
    -3.5406568750297965e-4 -3.5491970061496365e-4 -3.5406568750297965e-4 -3.566222308972933e-4  -3.557718763408139e-4
    -3.54925469491706e-4   -3.540656875029796e-4  -3.574686825591845e-4  -3.540656875029796e-4  -3.6782318096485804e-4
    -3.540656875029796e-4  -3.532087707264075e-4  -1.5154489218731276e-4 -1.3179140604722056e-4 -1.3386007757452988e-4
    -1.1874393036533725e-4 -1.5441197783770032e-4 -1.34274713012881e-4   -1.3184424068162631e-4 -2.432715249095262e-4
    -2.781006747382622e-4  -2.6128189871427247e-4 -1.9749920061530233e-4 -2.704856459868652e-4  -1.8369599228978755e-4
    -2.387431314202063e-4  -2.343841182931546e-4  -2.6877754875273183e-4 -2.3270132154951936e-4 -2.687581457475891e-4
    -2.3437311950019496e-4 -2.687676034469417e-4  -1.141558779425599e-4  -1.0540219353623843e-4 -7.911363527504039e-5
    -1.1235140434531775e-4 -2.1865125959281205e-4 -2.635487652861035e-4  -2.7322443766404414e-4 -2.6678223704016746e-4
    -7.95339840514658e-5   -2.4148755497402813e-4 -2.4401002857185857e-4 -1.2892535360254696e-4 -2.4148755497402813e-4
    -2.4332314945343537e-4 -2.1963261188699527e-4 -2.3836105351145357e-4 -2.4531467615046933e-4 -5.389778139277571e-4
    -3.9733399991204003e-4 -4.0232959791554806e-4 -3.549306975019173e-4  -3.380858488832399e-4  -3.380858488832399e-4
    -3.7306261311967494e-4 -3.6620881823706743e-4 -3.546189883013954e-4  -4.8545537817002045e-4 -3.514029930946907e-4
    -3.619626882591687e-4  -3.5137277097958543e-4 -2.979529287475637e-4  -2.321560222207599e-4  -1.256695198047979e-4
    -1.3570563917385172e-4 -1.1810908525487777e-4 -8.271630550837298e-5  -1.055333793836619e-4  -1.1361395537865143e-4
    -1.324560679069788e-4  -2.981669095652424e-4  -3.237734512078431e-4  -2.7836412535603146e-4 -2.2287769754584708e-4
    -2.5581782693011535e-4 -1.3774036615690324e-4 -2.4148755497402813e-4 -2.2556537131648597e-4 .8158505684838595
    -2.9837587657126005e-4 -1.6673123357044794e-4 -2.4148755497402813e-4 -2.4148755497402813e-4 -2.4148755497402813e-4
    -2.5071626806282005e-4 -1.607869301894732e-4  .3631741939898787      -2.037575069685073e-4  -1.8828038480321016e-4
    -4.0027077202062607e-4 -2.4148755497402813e-4 -8.198608181219189e-5  -2.4148755497402816e-4 -2.0286085863469434e-4
    -2.2666948047656853e-4 -2.4148755497402816e-4 -1.983055009443956e-4  -2.236517854537898e-4  -9.06522645607511e-5
    -2.871540803205714e-4  -2.9215209497265713e-4 -3.0974613935054826e-4 -2.517093120794477e-4  -1.704537261136401e-4
    -4.638525298312206e-4  -3.895486953816695e-4  -9.303553399954556e-5  -1.0356591947221979e-4 -1.1438202529279281e-4
    -1.2335367279912575e-4 -3.0489720074510835e-4 -1.2642956249488672e-4 -2.1871793914635606e-4 -1.693494343604548e-4
    -1.5669458389194703e-4 -2.4148755497402816e-4 -2.0983989396574512e-4 -4.205089731579836e-4  -4.4236257096672726e-4
    -4.205089731579836e-4  -4.217555440395031e-4  -4.3462240539957536e-4 -4.255961708857167e-4  -4.1810399680047405e-4
    -2.0041291417929435e-4 -1.8234884362185942e-4 -2.0927680062521973e-4 -1.6554521708128992e-4 -1.600916149608085e-4
    -1.8720969883431055e-4 -1.625023374493869e-4  -1.3281599747879313e-4 -5.66129378022233e-4   -1.6481116514512062e-4
    -2.4816756958657873e-4 -2.1600768307640427e-4 -4.170171941087201e-4  -2.041601950867711e-4  -2.676628003070001e-4
    -2.4524301437109163e-4 -2.1149861215725977e-4 -2.1388881185313943e-4 -2.1625258532686088e-4 -1.4850009253863962e-4
    -1.4853497505439633e-4 -2.4288274976797235e-4 -2.0304076283111003e-4 -1.763402087751906e-4  -2.6451600668407063e-4
    -2.972121857357019e-4  -1.9651946357032368e-4 -2.493053794779735e-4  -2.493053794779735e-4  -2.493053794779735e-4
    -2.493053794779736e-4  -2.5130244221776936e-4 -2.709211425406604e-4  -2.481970242170326e-4  -2.4865221960835177e-4
    -1.1805769907891386e-4 -2.793037856856428e-4  -1.5757567596066517e-3 -1.4530242371365497e-4 -2.465304905968448e-4
    -2.723592984214879e-4  -3.07167208867657e-4   -4.3742063132724043e-4 -4.601093063929524e-4  -2.4148755497402816e-4
    -2.4148755497402816e-4 -2.1474632446715766e-4 -2.118963710395646e-4  -3.6560675439635646e-4 -3.6560675439635646e-4
    -7.928170768641147e-5  -2.4148755497402816e-4 -1.473927485969812e-4  -7.383670875006529e-5  -9.872374921556164e-5
    -2.563415141468554e-4  -.29824951939476074    -2.4148755497402816e-4 -1.2331359541088008e-4 -1.0547921979714175e-4
    -9.977568193598498e-5  -2.1239660993381572e-4 -2.4148755497402816e-4 -6.182242944557276e-4  -7.177539576299547e-4
    -7.289918895483321e-4  -2.3552378920732074e-4 -2.4148755497402816e-4 -2.4148755497402816e-4 -2.2068762746552768e-4
    -2.2905732318932696e-4 -5.342896776493747e-4  -6.968250265037964e-4  -6.85024992280363e-4   -2.1355910524281063e-4
    -2.4484512930858147e-4 -2.4484512930858147e-4 -2.4484512930858147e-4 -2.530835736099805e-4  -2.3657172661410613e-4
    -2.5122697360232914e-4 -2.512269736023292e-4  -1.6327926915514834e-4 -1.6658026776261784e-4 -7.300055641541655e-5
    -1.042646529689281e-3  -1.042646529689281e-3  -1.042646529689281e-3  -1.042646529689281e-3  -1.042646529689281e-3
    -1.042646529689281e-3  -1.042646529689281e-3  -1.042646529689281e-3  -2.4148755497402816e-4 -2.5401265460288033e-4
    -1.643967674183948e-4  -1.643967674183948e-4  -1.643967674183948e-4  -1.630219423740981e-4  -1.5740127884770778e-4
    -1.2973934339601876e-4 -1.2979156559107536e-4 -2.919450519004511e-4  -4.2341933553371856e-4 -4.208771571422997e-4
    -4.17115512541565e-4   -2.284993382209475e-4  -3.3743255769311215e-4 -3.419317868192062e-4  -3.5292934373060836e-4
    -3.5292934373060836e-4 -4.112445903893669e-4  -3.7707032655932734e-4 -1.3618569780301113e-4 -2.8616101624969945e-4
    -2.9122778930865654e-4 -2.7173807498538324e-4 -4.6705040454341997e-4 -2.4148755497402816e-4 -1.6194438549638478e-4
    -2.1551887884429594e-4 -2.229062407455348e-4  -2.2659685716387763e-4 -2.1162632569785405e-4 -2.0766943505303635e-4
    -2.0899657630627893e-4 -2.0899657630627893e-4 -4.261214131955879e-4  -4.2134020835086193e-4 -1.6717443589736518e-4
    -2.500336132624086e-4  -2.657391288311602e-4  -1.834843896420943e-4  -2.044016110572247e-4  -2.142043943926279e-4
    -1.4862558432104106e-4 -9.680633180497695e-5  -2.1236425712400933e-4 -2.0706019269946667e-4 -2.1470654397864685e-4
    -2.2763322819526155e-4 -.336884954542226      -4.438229574127428e-4  -4.6986160373784994e-4 -4.936949066096456e-4
    -4.676111332510403e-4  -2.9197532896962767e-4 -4.8768122091481824e-4 -4.8768122091481824e-4 -2.893395034975486e-4
    -3.453872347405827e-4  -4.92197693335049e-4   -4.8414893417173595e-4 -4.933170616487348e-4  -2.89166795031721e-4
    -2.92924193240415e-4   -2.8795165063726867e-4 -4.292770522629199e-4  -4.273608755893025e-4  -6.598099521886768e-4
    -7.409643108372358e-4  -8.358887566618612e-4  -4.4359290206526865e-4 -5.907090161204959e-4  -5.926489794229985e-4
    -4.642167236923368e-4  -5.124957840656777e-4  -5.124957840656777e-4  -4.891079348587251e-4  -4.3750159632156827e-4
    -7.866155041063502e-5  -7.866155041063502e-5)
  #(-1.254098659779365e-4  -1.3589573755095065e-4
    -1.4534141504833959e-4 -1.4251610678732383e-4
    -1.239919253396892e-4  -1.2140574647907656e-4
    -1.239919253396892e-4  -1.3264576975781294e-4
    -1.2461666893668938e-4 -1.3625219707787687e-4
    -1.4534141504833959e-4 -1.3571710908823138e-4
    -1.4251610678732383e-4 -1.239919253396892e-4
    -1.4534141504833959e-4 -1.4251610678732383e-4
    -1.239919253396892e-4  -1.3589573755095065e-4
    -1.4534141504833959e-4 -1.4251610678732383e-4
    -1.4534141504833959e-4 -1.4251610678732383e-4
    -1.4251610678732383e-4 -1.3085158312076294e-4
    -1.39469230572481e-4   -1.39469230572481e-4
    -1.396432362167535e-4  -1.3301419787899123e-4
    -1.1301263346444347e-4 -1.3319821545023755e-4
    -1.2992467560263377e-4 -1.017277946295374e-4
    -1.3090245378822232e-4 -1.3041403128493114e-4
    -1.2645370746184047e-4 -1.2594247955534125e-4
    -1.2632953416888965e-4 -8.45816386672272e-5
    -8.45816386672272e-5   -5.679010203453648e-5
    -5.762799958827609e-5  -7.734693479008062e-5
    -1.0371741468494262e-4 -7.703788978940745e-5
    -5.679010203453648e-5  -2.3351153704886845e-5
    -2.298153369601886e-5  -1.9672206312973718e-5
    -3.3699548231827106e-5 -2.4148288246422062e-5
    -1.991123419428402e-5  .41916684179098
    2.9905075600841755e-3  .00300690819614773
    1.1048447062176638e-3  -6.876215189429895e-5
    .698611402984965       -4.0301325684741036e-5
    -9.761297924030131e-5  -2.5707138520176174e-5
    -5.175549996678965e-5  -6.896514622121664e-5
    -3.415765296146878e-5  -1.1213467475683063e-4
    -1.2475241452921046e-4 -8.71315561735621e-5
    -1.0950963193936088e-4 -1.0791892995795388e-4
    -1.1327459387574788e-4 -1.0584038126464306e-4
    -1.0950963193936088e-4 -1.1683519418994664e-4
    -1.2037029946607607e-4 -1.0950963193936088e-4
    -1.1833377050224375e-4 -1.2182543971800664e-4
    -1.1072311892478529e-4 -1.1072311892478529e-4
    -1.1202980968883426e-4 -.00011571275002497
    -1.1202980968883426e-4 -.00011571275002497
    -1.275480257544456e-4  -9.83673081564031e-5
    -9.882588376514108e-5  -5.4394873625530114e-5
    -6.505505411971346e-5  -9.027407694670515e-5
    -9.608161748418244e-5  -2.898709854147891e-5
    -3.301542016717419e-5  -1.7837113529378273e-5
    -9.054718648248927e-5  -5.654605881864453e-5
    -4.93794987489327e-5   -4.5197033918949654e-5
    -4.155070677424817e-5  -4.619651171643411e-5
    -4.5740430967717506e-5 -4.5740430967717506e-5
    -5.043807461239209e-5  -5.043807461239209e-5
    -5.0864986753396264e-5 -6.537080691439832e-5
    -4.197487449553014e-5  -2.0645271486487215e-5
    -6.237733399706151e-5  -3.6672646688092315e-5
    -2.095559331950649e-5  -4.668914880665848e-5
    -4.8710063457008324e-5 -4.8710063457008324e-5
    -3.190692590825398e-5  -3.877394538898779e-5
    -4.797715453812372e-5  -4.065379830797189e-5
    -1.1752396610729427e-4 -1.1752396610729427e-4
    -1.1668548666893941e-4 -1.314562647132785e-4
    -1.314562647132785e-4  -1.3108214330337926e-4
    -1.3108214330337926e-4 -8.847000401334539e-5
    -7.265643704726688e-5  -7.265643704726688e-5
    -7.265643704726688e-5  -7.265643704726688e-5
    -7.265643704726688e-5  -7.265643704726688e-5
    -7.265643704726688e-5  -7.087248728821231e-5
    -7.18672043701997e-5   -9.12924068081671e-5
    -1.0077399920326202e-4 -9.86834398253168e-5
    -9.86834398253168e-5   -1.0153121978850424e-4
    -1.0223145943240797e-4 -9.902128767700399e-5
    -8.340638795185106e-5  -8.75587287002826e-5
    -1.0070625696667417e-4 -9.620355491791091e-5
    -9.569476049456989e-5  -9.643738768177458e-5
    -9.282643025353471e-5  -9.615092998251098e-5
    -7.014799663551778e-5  -8.679540237482656e-5
    -3.845131717240685e-5  -3.845131717240686e-5
    -5.9257293962791153e-5 -3.899436892434357e-5
    -6.755939882090732e-5  -6.755939882090731e-5
    -1.229160895163893e-4  -1.229160895163893e-4
    -1.2211464356173566e-4 -1.3611728936470478e-4
    -1.362983069056238e-4  -1.3629830690562385e-4
    -1.3593751359401103e-4 -1.3593751359401103e-4
    -1.3701512219600176e-4 -1.3871822125804766e-4
    -1.3629744781758557e-4 -1.366570759148804e-4
    -9.854385056325485e-5  -4.59643972411564e-5
    -1.0474097431920899e-4 -5.452712449110225e-5
    -2.9678435494361967e-5 -1.0535946520440041e-4
    -6.288421258005831e-5  -6.885150480233812e-5
    -3.9613125915436384e-5 -5.548889262015269e-5
    -1.1481066233075028e-4 -1.2257380455209753e-4
    -1.2257380455209753e-4 -1.1885177600388241e-4
    -1.2257380455209753e-4 -1.2257380455209753e-4
    -6.665792006225278e-5  -6.665792006225278e-5
    -5.6442051103713735e-5 -5.482173465710352e-5
    -5.320348217593098e-5  -5.526358444982795e-5
    -5.5706946279205085e-5 -5.191090787465799e-5
    -5.688985296546653e-5  -5.04721562238865e-5
    -6.504898816525411e-5  -5.7795676224767966e-5
    -5.91802892984612e-5   -5.363300215820327e-5
    -4.580049254703144e-5  -1.2424195884872625e-4
    -1.2424195884872625e-4 -1.1658979420936808e-4
    -1.2424195884872625e-4 -1.2290155192342764e-4
    -1.2290155192342764e-4 -3.3942186577232364e-5
    -3.6653085743242526e-5 -3.764722908081889e-5
    -4.0709517959921995e-5 -4.1607329318081895e-5
    -4.161077519345936e-5  -4.24895613757934e-5
    -4.8486114711421077e-5 -3.623189870644479e-5
    -7.271810204034603e-5  -6.873553128929415e-5
    -7.146901894810909e-5  -3.6968821524267026e-5
    -1.0535946520440041e-4 -1.0133270135740874e-4
    -3.934957964263663e-5  -4.831780022263337e-5
    -4.8000964419001956e-5 -5.77717858114117e-5
    -7.165628637619325e-5  -6.124349190170986e-5
    -7.133558766927351e-5  -5.6158200888119345e-5
    -4.908826324121637e-5  -5.283092638914231e-5
    -5.3279369831446266e-5 -7.105029201805465e-5
    -7.105029201805465e-5  -7.105029201805465e-5
    -4.503285374222011e-5  -3.1553499113156154e-5
    -3.913727592543562e-5  -4.7904074887070626e-5
    -2.877251419552173e-5  -1.0682164906704112e-4
    -3.919694497214122e-5  -4.655993028813995e-5
    -2.808361040340263e-5  -5.4773986084927036e-5
    -1.0040109033904221e-4 -1.1055672397323098e-4
    -1.0928853080828673e-4 -1.1081649518240007e-4
    -1.053198198496769e-4  -1.0959178590860678e-4
    -3.560927678752122e-5  -6.199323231917017e-5
    -6.803899606205972e-5  -9.451040845896716e-5
    -3.4971241983142706e-5 -8.973331444631692e-5
    -8.920945552141573e-5  -6.402276336978242e-5
    -6.402276336978242e-5  -6.402276336978242e-5
    -6.402276336978243e-5  -6.402276336978243e-5
    -6.402276336978243e-5  -4.934754678292113e-5
    -4.934754678292113e-5  -9.418139121702565e-5
    -1.1375639356121282e-4 -1.1314632960679484e-4
    -1.1360172304455495e-4 -1.1520749760785227e-4
    -1.1501971541206584e-4 -1.1316142341289182e-4
    -1.1273068528198333e-4 -1.1294640168562027e-4
    -1.1335927237660365e-4 -4.874651655658968e-5
    -1.0535946520440041e-4 -5.3575640244325195e-5
    -1.2158742452557687e-4 -1.20442523011387e-4
    -1.219760417713817e-4  -1.1762061356813845e-4
    -1.1782739281861848e-4 -1.165813010365118e-4
    -1.1820858759341922e-4 -1.2003057220399662e-4
    -1.1637224609400739e-4 -1.1782739281861846e-4
    -1.1782739281861846e-4 -1.1762061356813845e-4
    -1.1762061356813845e-4 -1.2449354265677383e-4
    -1.2449354265677383e-4 -1.192377450242003e-4
    -1.1637224609400739e-4 -1.1616291525754037e-4
    -6.19333997804107e-5   -6.231733039980109e-5
    -6.779328660971864e-5  -6.779328660971864e-5
    -1.0011489894729071e-4 -1.0757993384983364e-4
    -8.173944468581229e-5  -9.128500253853053e-5
    -9.181234146704173e-5  -1.060421108791772e-4
    -1.0801737694977985e-4 -1.0714400449121022e-4
    -1.0541752609273483e-4 -6.114412914575496e-5
    -7.74897612368136e-5   -9.422047050754948e-5
    -1.0252513080046712e-4 -9.99739460302907e-5
    -1.002166850204078e-4  -9.99739460302907e-5
    -1.0070038500797161e-4 -1.0045882995413866e-4
    -1.0021647195032538e-4 -9.99739460302907e-5
    -1.009414302172083e-4  -9.99739460302907e-5
    -1.022398106468463e-4  -9.99739460302907e-5
    -9.973064678265281e-5  -5.992016020100769e-5
    -4.424672460509082e-5  -4.222306349506925e-5
    -3.353775577461341e-5  -3.987726047976754e-5
    -3.5527729534767144e-5 -3.485907417052138e-5
    -1.1220227154980773e-4 -1.2177427609175325e-4
    -1.091442796456036e-4  -8.926690057553341e-5
    -1.1666907232876112e-4 -8.708048213205372e-5
    -6.199428484626806e-5  -1.0128025758874147e-4
    -1.113528955102756e-4  -1.0080068336605843e-4
    -1.1135654250218346e-4 -1.0128039799544218e-4
    -1.1135302273235805e-4 -2.396605075161357e-5
    -1.9589908366291516e-5 -1.533601167006439e-5
    -5.0595691891836704e-5 -9.882555713838831e-5
    -7.080609087481777e-5  -7.345253061168405e-5
    -7.147498884953168e-5  -1.9401867929708477e-5
    -1.0535946520440041e-4 -1.1357208078567056e-4
    -4.312539396223206e-5  -1.0535946520440041e-4
    -1.1335831474650679e-4 -6.437524337442298e-5
    -4.7997648806644235e-5 -4.939555634410251e-5
    -7.834206560277804e-5  -6.560126955516187e-5
    -6.625472280397177e-5  -4.8208305030406515e-5
    -4.636004992101449e-5  -4.636004992101449e-5
    -5.089548964810952e-5  -5.002382074799971e-5
    -5.3415762364784755e-5 -5.9778281507831425e-5
    -4.774906656422711e-5  -4.911278878765824e-5
    -4.774970621958996e-5  -5.5508815437663666e-5
    -1.0769816752603788e-4 -4.0844629199882684e-5
    -4.696923527727703e-5  -4.33649050575409e-5
    -5.373630680946283e-5  -6.138492043750972e-5
    -5.55563742919042e-5   -6.298476220480247e-5
    -7.556572461171167e-5  -8.797362607609419e-5
    -6.762086094767454e-5  -4.854757809807427e-5
    -6.622575627041994e-5  -3.96468025854927e-5
    -1.0535946520440041e-4 -9.884679346225374e-5
    -.2508091694144963     -7.324746678965439e-5
    -6.650936272624328e-5  -1.0535946520440041e-4
    -1.0535946520440041e-4 -1.0535946520440041e-4
    -8.124474916973086e-5  -3.5513147441975645e-5
    -.44428853590949813    -8.574616078832794e-5
    -7.682600334491577e-5  -9.394203538896998e-5
    -1.0535946520440041e-4 -5.326964806253093e-5
    -1.0535946520440041e-4 -4.7155707405967664e-5
    -5.1195633379985037e-5 -1.0535946520440041e-4
    -4.8507916739283486e-5 -5.8111472684256665e-5
    -2.693596177579504e-5  -7.252045860902672e-5
    -7.384941469052826e-5  -1.0812117504563951e-4
    -7.760437804091977e-5  -5.183767746334816e-5
    -9.143594488243676e-5  -8.586192043334065e-5
    -5.417162863207131e-5  -5.724939502278838e-5
    -6.176640274254736e-5  -6.448274208963425e-5
    -4.1250981746376156e-5 -2.630642634817714e-5
    -9.020036116382345e-5  -4.67517252243456e-5
    -3.8767922922586726e-5 -1.0535946520440041e-4
    -5.05287012906139e-5   -9.767469069590116e-5
    -1.0290888536380561e-4 -9.767469069590116e-5
    -9.791388753800202e-5  -1.0098547172604563e-4
    -9.863215881018893e-5  -9.719912906574765e-5
    -4.375785667524795e-5  -3.985849754737591e-5
    -3.9284905033975035e-5 -4.9526603550585005e-5
    -4.8560776875881363e-5 -5.5545782509500974e-5
    -4.904699218599822e-5  -3.692120015025434e-5
    -1.1428056572781687e-4 -3.562967291378626e-5
    -5.595424399599118e-5  -5.107994744824035e-5
    -1.232933882493155e-4  -3.685135788295946e-5
    -5.958060840354748e-5  -5.479044731049424e-5
    -3.7924555181954125e-5 -3.827543474815813e-5
    -3.862351251146844e-5  -3.908988999626475e-5
    4.4096697512468634e-5  -9.442975995863568e-5
    -4.171722891129023e-5  -3.614027823157772e-5
    -4.8833494589293225e-5 -4.083932368700454e-5
    -4.107038870452191e-5  -4.594815033938829e-5
    -4.594815033938829e-5  -4.594815033938829e-5
    -4.594815033938829e-5  -4.939344260294493e-5
    -5.3265589318251695e-5 -6.222324095895903e-5
    -6.424133866312686e-5  -3.451624980046647e-5
    -1.215311214234069e-4  -4.79401938892022e-5
    -2.7169586603605395e-5 -4.111700589121854e-5
    -8.210653876539202e-5  -9.993354679285904e-5
    -9.90566553885242e-5   -1.0403149814863986e-4
    -1.0535946520440041e-4 -1.0535946520440041e-4
    -9.502522536825736e-5  -9.329463720425192e-5
    -4.51784041350889e-5   -4.51784041350889e-5
    -2.465294925476054e-5  -1.0535946520440041e-4
    -3.372945087751662e-5  -4.7424042188223115e-5
    -5.5942264102946205e-5 -5.152139049399048e-5
    -.2755360531628106     -1.0535946520440041e-4
    -3.323265653327645e-5  -3.0037794109437076e-5
    -2.840108876566604e-5  -9.160567669239549e-5
    -1.0535946520440041e-4 -6.921128412477659e-5
    -7.699764690529112e-5  -8.00098834187321e-5
    -5.6307575002935716e-5 -1.0535946520440041e-4
    -1.0535946520440041e-4 -4.2434965222301534e-5
    -4.538626423120642e-5  -6.253650221315968e-5
    -7.998136798573127e-5  -7.69660864588095e-5
    -3.0247442700009453e-5 -4.592920552928393e-5
    -4.592920552928393e-5  -4.592920552928393e-5
    -5.828625290699829e-5  -5.4490201239746846e-5
    -5.787768932152676e-5  -5.787768932152676e-5
    -3.0291736243764852e-5 -4.958335542851023e-5
    -4.68935809775331e-5   -9.70459148433275e-5
    -9.70459148433275e-5   -9.70459148433275e-5
    -9.704591484332751e-5  -9.704591484332751e-5
    -9.704591484332751e-5  -9.704591484332751e-5
    -9.704591484332751e-5  -1.0535946520440041e-4
    -1.1795278064751375e-4 -5.359180044106047e-5
    -5.359180044106047e-5  -5.359180044106047e-5
    -5.3132679449864405e-5 -5.125514342594907e-5
    -4.050915648676459e-5  -3.986202419647013e-5
    -8.095802913433967e-5  -1.0414522513142601e-4
    -1.0141732546779556e-4 -1.0072449734327517e-4
    -4.883774073161668e-5  -8.787954754645715e-5
    -8.86719593671015e-5   -9.047593954822835e-5
    -9.047593954822835e-5  -1.0188189382434585e-4
    -9.549040321125168e-5  -2.749288756775059e-5
    -9.964453627299014e-5  -1.0355491769716612e-4
    -5.423751771227677e-5  -7.11623362292053e-5
    -1.0535946520440041e-4 -4.439425763910102e-5
    -6.246751070683393e-5  -6.590395846963249e-5
    -6.699490216153827e-5  -6.129976812886433e-5
    -6.010550159522499e-5  -6.0507408701015524e-5
    -6.0507408701015524e-5 -1.0067095568766858e-4
    -9.930941696342255e-5  -4.854962983741633e-5
    -6.907056240834536e-5  -7.128738199950879e-5
    -8.737005402433602e-5  -3.323209241373864e-5
    -3.458264899978013e-5  -5.0764938120032446e-5
    -2.8562453816454466e-5 -9.37580837130382e-5
    -9.273608783633388e-5  -9.426859735204805e-5
    -1.0750731590052006e-4 -1.5628199456130696e-5
    -9.802704201532116e-5  -1.0452467165459378e-4
    -1.1033785078079808e-4 -1.0407484364017974e-4
    -6.63009860221904e-5   -1.0639455162572088e-4
    -1.0639455162572088e-4 -1.1118868264258244e-4
    -7.958211584701193e-5  -1.0727557806283857e-4
    -1.0579280509286489e-4 -1.0749480837846913e-4
    -6.116579064624173e-5  -6.192038040316199e-5
    -6.384414560504733e-5  -7.428130242911404e-5
    -7.401351822687383e-5  1.3563855271876698e-5
    -8.24195256708801e-5   -9.382824786692905e-5
    -5.5073026814237496e-5 -8.681163285092266e-5
    -8.70269956710528e-5   -6.459877014136288e-5
    -8.273608565087726e-5  -8.230870286477764e-5
    -7.604751141819645e-5  -7.313591813122904e-5
    -2.0848069371381975e-5 -2.0848069371381975e-5)))

(define (check-answer v)
  (define (scan tail)
    (cond ((null? tail) (display "; Can't check answer") (newline))
	  ((= (vector-length (car tail)) (vector-length v))
	   (or (close-enuf? v (car tail) 0.0001)
	       (error "Answer didn't check.")))
	  (else (scan (cdr tail)))))
  (scan *known-answers*))

;; Local Variables:
;; Eval: (put 'dotimes 'scheme-indent-function 1)
;; Eval: (sum 'unless 'scheme-indent-function 1)
;; Eval: (put 'unless 'scheme-indent-function 1)
;; Eval: (put 'when 'scheme-indent-function 1)
;; End:
